package com.lottery.material.service.base;

import com.lottery.material.entity.base.BaseEntity;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;

import java.io.Serializable;
import java.util.List;

/**
 * Description：基础Service接口
 * Created by 朱正磊 on 2019-03-21 23:30
 */
public interface BaseService<T extends BaseEntity, ID extends Serializable> {

    /**
     * description：根据主键查找唯一数据
     * user 朱正磊
     * time 2019-03-21 23:42
     * @param id 主键
     * @return 返回实体类对象
     */
    T findById(ID id);

    /**
     * description：查询所有数据
     * user 朱正磊
     * time 2019-03-21 23:43
     * @return 返回实体类对象集合列表
     */
    List<T> findAll();

    /**
     * description：根据主键数组查询数据集合列表
     * user 朱正磊
     * time 2019-03-21 23:47
     * @param ids 主键数组
     * @return 返回数据集合列表
     */
    List<T> findList(ID[] ids);

    /**
     * description：根据主键集合查询数据集合列表
     * user 朱正磊
     * time 2019-03-21 23:48
     * @param ids 主键集合
     * @return 返回数据集合列表
     */
    List<T> findList(Iterable<ID> ids);

    /**
     * description：分页查询
     * user 朱正磊
     * time 2019-03-21 23:54
     * @param pageable 分页请求对象
     * @return 返回分页数据
     */
    Page<T> findAll(Pageable pageable);

    /**
     * description：根据查询条件分页查询
     * user 朱正磊
     * time 2019-03-21 23:54
     * @param specification 查询条件对象
     * @param pageable 分页请求对象
     * @return 返回分页数据
     */
    Page<T> findAll(Specification<T> specification, Pageable pageable);

    /**
     * description：查询总记录数
     * user 朱正磊
     * time 2019-03-22 0:08
     * @return 返回记录数
     */
    Long count();

    /**
     * description：根据条件查询记录数
     * user 朱正磊
     * time 2019-03-22 0:09
     * @param specification 条件对象
     * @return 返回记录数
     */
    Long count(Specification<T> specification);

    /**
     * description：判断是否存在给定主键的记录
     * user 朱正磊
     * time 2019-03-22 0:11
     * @param id 主键
     * @return 如果存在返回true，否则返回false
     */
    Boolean exists(ID id);

    /**
     * description：新增一条记录
     * user 朱正磊
     * time 2019-03-22 0:14
     * @param entity 实体对象
     * @return 返回新增的实体对象（可以拿到ID）
     */
    T save(T entity);

    /**
     * description：更新一条记录
     * user 朱正磊
     * time 2019-03-22 0:14
     * @param entity 实体对象
     * @return 返回更新后的实体对象
     */
    T update(T entity);

    /**
     * description：删除一条记录
     * user 朱正磊
     * time 2019-03-22 0:14
     * @param id 主键
     */
    void delete(ID id);

    /**
     * description：根据主键可变长度数组批量删除记录
     * user 朱正磊
     * time 2019-03-22 0:21
     * @param ids 主键可变长度数组
     */
    @SuppressWarnings("unchecked")
    void deleteByIds(ID... ids);

    /**
     * description：根据实体类对象数组批量删除记录
     * user 朱正磊
     * time 2019-03-22 0:21
     * @param entities 实体类对象数组
     */
    void delete(T[] entities);

    /**
     * description：根据实体类对象集合批量删除记录
     * user 朱正磊
     * time 2019-03-22 0:21
     * @param entities 实体类对象集合
     */
    void delete(Iterable<T> entities);

    /**
     * description：根据实体类对象删除记录
     * user 朱正磊
     * time 2019-03-22 0:21
     * @param entity 实体类对象
     */
    void delete(T entity);

    /**
     * description：根据条件以及排序查询记录列表
     * user 朱正磊
     * time 2019-03-22 0:21
     * @param specification 条件
     * @param sort 排序
     * @return 返回查询结果集（记录列表）
     */
    List<T> findList(Specification<T> specification, Sort sort);

}
